package com.jsh.erp.utils;

import io.qdrant.client.grpc.JsonWithInt;
import io.qdrant.client.grpc.Points;
import org.springframework.ai.document.Document;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class QdrantDocumentUtils {

    /**
     * 将Qdrant的ScoredPoint转换为Spring AI的Document对象
     *
     * @param scoredPoint Qdrant返回的评分点
     * @param payloadTextKey 在payload中存储文本内容的键名
     * @return 转换后的Document对象
     */
    public static Document toDocument(Points.ScoredPoint scoredPoint, String payloadTextKey) {
        Map<String, JsonWithInt.Value> payload = scoredPoint.getPayloadMap();

        // 提取文本内容
        String content = "";
        JsonWithInt.Value textValue = payload.get(payloadTextKey);
        if (textValue != null && textValue.hasStringValue()) {
            content = textValue.getStringValue();
        }

        // 提取元数据（排除文本内容键）
        Map<String, Object> metadata = new HashMap<>();
        for (Map.Entry<String, JsonWithInt.Value> entry : payload.entrySet()) {
            if (!entry.getKey().equals(payloadTextKey)) {
                // 处理不同类型的值
                JsonWithInt.Value value = entry.getValue();
                if (value.hasStringValue()) {
                    metadata.put(entry.getKey(), value.getStringValue());
                } else if (value.hasBoolValue()) {
                    metadata.put(entry.getKey(), value.getBoolValue());
                } else if (value.hasIntegerValue()) {
                    metadata.put(entry.getKey(), value.getIntegerValue());
                } else if (value.hasDoubleValue()) {
                    metadata.put(entry.getKey(), value.getDoubleValue());
                } else if (value.hasNullValue()) {
                    metadata.put(entry.getKey(), null);
                } else if (value.hasListValue()) {
                    // 处理列表值
                    metadata.put(entry.getKey(), value.getListValue().getValuesList().stream()
                            .map(QdrantDocumentUtils::convertValue)
                            .collect(Collectors.toList()));
                } else if (value.hasStructValue()) {
                    // 处理结构体值
                    metadata.put(entry.getKey(), value.getStructValue().getFieldsMap());
                }
            }
        }

        // 添加ID到元数据（Spring AI最佳实践）
        metadata.put("id", scoredPoint.getId().getUuid());

        // 创建Document对象，包含内容、元数据和相似度分数
        return new Document(
                content
//                ,metadata,
//                scoredPoint.getScore()  // Spring AI Document直接使用分数值
        );
    }

    /**
     * 将Qdrant Value转换为Java对象
     */
    private static Object convertValue(JsonWithInt.Value value) {
        if (value.hasStringValue()) {
            return value.getStringValue();
        } else if (value.hasBoolValue()) {
            return value.getBoolValue();
        } else if (value.hasIntegerValue()) {
            return value.getIntegerValue();
        } else if (value.hasDoubleValue()) {
            return value.getDoubleValue();
        } else if (value.hasListValue()) {
            return value.getListValue().getValuesList().stream()
                    .map(QdrantDocumentUtils::convertValue)
                    .collect(Collectors.toList());
        }
        return null;
    }
}
